package org.huawei260.OD260;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

/**
 * @Auther: qingle
 * @Date: 2024/8/21-23:58
 * @Description:
 *
 *
 * @version: 1.0
 */



public class O0014_单词接龙_AI2 {

	public static void main(String[] args) {
		try (Scanner scanner = new Scanner(System.in)) {
			int k = Integer.parseInt(scanner.nextLine());
			int N = Integer.parseInt(scanner.nextLine());
			ArrayList<String> words = new ArrayList<>();
			for (int i = 0; i < N; i++) {
				words.add(scanner.nextLine());
			}
			findLongestChain(k, words);
		}

	}


	private static void findLongestChain(int k, ArrayList<String> words) {
		StringBuilder builder = new StringBuilder();
		builder.append(words.get(k));
		words.remove(k);

		words.sort((w1, w2) -> {
			int len1 = w1.length();
			int len2 = w2.length();
			if (len1 != len2) {
				return len2 - len1;
			} else {
				return w1.compareTo(w2);
			}
		});

		// 初始化长度变量，用于后续比较字符串长度是否发生变化
		int len;
		// 使用do-while循环来构建字符串，直到字符串长度不再变化
		do {
		    // 获取当前构建字符串的长度
		    len = builder.length();
		    // 获取构建字符串的最后一个字符，用于后续拼接判断
		    String last = builder.substring(builder.length() - 1);
		    // 遍历单词列表，寻找可以拼接在构建字符串末尾的单词
		    for (int i = 0; i < words.size(); i++) {
		        // 获取当前遍历到的单词
		        String cur = words.get(i);
		        // 检查当前单词是否可以接在构建字符串的末尾
		        if (cur.startsWith(last)) {
		            // 如果可以，则将该单词追加到构建字符串中
		            builder.append(cur);
		            // 并从单词列表中移除已经使用过的单词，防止重复使用
		            words.remove(cur);
		            // 跳出循环，避免在当前已经找到合适的单词后继续无谓的遍历
		            break;
		        }
		    }
		} while (builder.length() != len);
		// 循环直到构建字符串的长度不再变化，意味着无法再添加更多的单词


		System.out.println(builder);
	}
}